package com.ideal.framework.pagetag;

import org.apache.log4j.Logger;

/**
 * 系统日志 请使用该工具代替System.out.println 来打印日志。
 * 
 * @author Chengjiangz
 * 
 */
public class SysLogger {

	/**
	 * log服务初始化标志，默认值为false， 第一次初始化之后标志位置为true，即不会进行第二次初始化
	 */
	private static boolean initFlag = false;
	

	/**
	 * 得到一个log4j提供的log服务的引用
	 */
	private static Logger logger = Logger.getLogger(SysLogger.class.getName());

	private static Logger debuglog = Logger.getLogger("debuglog");
	private static Logger infolog = Logger.getLogger("infolog");
	private static Logger warnlog = Logger.getLogger("warnlog");
	private static Logger errorlog = Logger.getLogger("errorlog");

	public static boolean isDebugEnabled() {
		return debuglog.isDebugEnabled();
	}

	public static boolean isInfoEnabled() {
		return infolog.isDebugEnabled();
	}

	public static boolean isWarnEnabled() {
		return warnlog.isDebugEnabled();
	}

	public static boolean isErrorEnabled() {
		return errorlog.isDebugEnabled();
	}

	/** Creates new SysLogger */
	public SysLogger() {
	}

	/**
	 * debug级别的log方法,写入指定的文件
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param str
	 *            提示信息
	 */
	public static void debugLog(String className, String methodName, String str) {
		debug(Gb2ToIso(className), Gb2ToIso(methodName), Gb2ToIso(str));
	}

	/**
	 * debug级别的log方法,写入指定的文件
	 * 
	 * @param str
	 *            提示信息
	 */
	public static void debugLog(String str) {
		debug(Gb2ToIso(str));
	}

	/**
	 * 程序状态信息的输出，写入指定的文件
	 * 
	 * @param infoStr
	 *            提示信息
	 */
	public static void infoLog(String infoStr) {
		info(Gb2ToIso(infoStr));
	}

	/**
	 * 读取log配置文件。
	 */
	private static void init() {
		if (initFlag == true) {
			return; // 已初始化，直接返回
		} else {
			// PropertyConfigurator.configure(Config.getConfig("syslogger.config.file"));
			initFlag = true;
		}
	}

	/**
	 * debug级别的log方法,写入指定的文件
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param debugStr
	 *            提示信息
	 */
	public static void debug(String className, String methodName,
			String debugStr) {
		debug(className + "." + methodName + "( ): " + debugStr);
	}

	/**
	 * debug级别的log方法,写入指定的文件
	 * 
	 * @param debugStr
	 *            提示信息
	 */
	public static void debug(String debugStr) {
		init();
		debuglog.debug(Gb2ToIso(debugStr));
	}

	/**
	 * info级别的log方法,写入指定的文件
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param infoStr
	 *            提示信息
	 */
	public static void info(String className, String methodName, String infoStr) {
		info(className + "." + methodName + "( ): " + infoStr);
	}

	/**
	 * info级别的log方法,写入指定的文件
	 * 
	 * @param infoStr
	 *            提示信息
	 */
	public static void info(String infoStr) {
		init();
		infolog.info(Gb2ToIso(infoStr));
	}

	/**
	 * warn级别的log方法,写入指定的文件
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param warnStr
	 *            提示信息
	 */
	public static void warn(String className, String methodName, String warnStr) {
		warn(className + "." + methodName + "( ): " + warnStr);
	}

	/**
	 * warn级别的log方法,写入指定的文件
	 * 
	 * @param warnStr
	 *            提示信息
	 */
	public static void warn(String warnStr) {
		init();
		warnlog.warn(Gb2ToIso(warnStr));
	}

	/**
	 * error级别的log方法,写入指定的文件
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param errorStr
	 *            提示信息
	 */
	public static void error(String className, String methodName,
			String errorStr) {
		error(className + "." + methodName + "( ): " + errorStr);
	}

	/**
	 * error级别的log方法,写入指定的文件
	 * 
	 * @param className
	 *            类名
	 * @param methodName
	 *            方法名
	 * @param errorStr
	 *            提示信息
	 */
	public static void sysError(String className, String methodName,
			String errorStr) {
		sysError(className + "." + methodName + "( ): " + errorStr);
	}

	/**
	 * error级别的log方法,写入指定的文件
	 * 
	 * @param errorStr
	 *            提示信息
	 */
	public static void error(String errorStr) {
		init();
		errorlog.error(Gb2ToIso(errorStr));
	}

	public static void sysError(String errorStr) {
		init();
		errorlog.error(errorStr);
	}

	/**
	 * 打印一维数组，在一行内显示；例: name[]: value0 value1 value2
	 * 
	 * @param array
	 *            要打印的数组
	 * @param name
	 *            数组的名称
	 * @return 返回转换后的字符串
	 */
	public static String toString(String[] array, String name) {
		if (array == null || name == null) {
			debug("##### SysLogger toString null !!!");
			return null;
		}
		// debug("##### SysLogger toString != null");
		StringBuffer sb = new StringBuffer();
		int length = array.length;
		sb.append(name + "[]");
		for (int i = 0; i < length; i++) {
			sb.append("\t" + array[i]);
		}
		return sb.toString();
	}

	/**
	 * 打印一维数组，在一行内显示；例: name[]: value0 value1 value2
	 * 
	 * @param array
	 *            要打印的数组
	 * @param j
	 *            指定的数组的列
	 * @param name
	 *            数组的名称
	 * @return 返回转换后的字符串
	 */
	public static String toString(String[] array, int j, String name) {
		if (array == null || name == null) {
			debug("##### SysLogger toString null !!!");
			return null;
		}
		// debug("##### SysLogger toString != null");
		StringBuffer sb = new StringBuffer();
		int length = array.length;
		sb.append(name + "[" + j + "][]");
		for (int i = 0; i < length; i++) {
			sb.append("\t" + array[i]);
		}
		return sb.toString();
	}

	/**
	 * 打印二维数组，每行显示一行数据；例: name[0][]: value00 value01 value02 name[1][]: value10
	 * value11 value12
	 * 
	 * @param array
	 *            要打印的二维数组
	 * @param name
	 *            数组的名称
	 * @return 返回转换后的字符串
	 */
	public static String toString(String[][] array, String name) {
		if (array == null || name == null) {
			debug("##### SysLogger toString null !!!");
			return null;
		}
		StringBuffer sb = new StringBuffer();
		int rowLength = array.length;
		int colLength = array[0].length;
		for (int i = 0; i < rowLength; i++) {
			sb.append(name + "[" + i + "][]");
			for (int j = 0; j < colLength; j++) {
				sb.append("\t" + array[i][j]);
			}
			if (i < rowLength) {
				sb.append("\n");
			}
		}
		return sb.toString();
	}

	/**
	 * SysLogger所提供的功能的测试函数
	 */
	public static void main(String args[]) throws Exception {
		for (int i = 0; i < 10; i++) {
			warn("dmslog" + i);
			info("dmsinfolog" + i);
			debug("dmsdebuglog" + i);
			error("dmserrorlog" + i);
		}

	}

	public static String Gb2ToIso(String val) {
		/*
		 * if (val == null || val.equals("")) return val; try { return new
		 * String(val.getBytes("gb2312"), "ISO-8859-1"); } catch
		 * (java.io.UnsupportedEncodingException ex) { return val; }
		 */
		return val;
	}
}